#include "vtor_key.h"

#ifdef __VTOR_KEY__

VtorKey* vtorKeyHeader = NULL;


uint8_t VtorKey_Scan(uint16_t scanTime)
{
	uint8_t handlerFlag = 0;
	VtorKey* curVtorKey = vtorKeyHeader;
	// 用户自定义，获取按键电平
	VtorKey_GetLevel();
	while(curVtorKey != NULL)
	{
		// 针对电平时长进行统计，如果电平变化，则时间清零
		if (curVtorKey->lastLevel != curVtorKey->curLevel)
		{
			curVtorKey->lastLevel = curVtorKey->curLevel;
			curVtorKey->holdTime = 0;
		}
		else
		{
			// 对时长最大值进行限制，防止太大，导致数据溢出
			if (curVtorKey->holdTime <= VTOR_KEY_TIME_MAX)
			{
				curVtorKey->holdTime += scanTime;
			}
		}


		curVtorKey->lastState = curVtorKey->curState;
		// 时长足够长消抖之后，才能确定按键状态  按下 或弹起状态
		if (curVtorKey->holdTime > VTOR_KEY_TIME_SHAKE)
		{
			// 更新state，从而下次更新event
			if (VTOR_KEY_LEVEL_DOWN == curVtorKey->curLevel)
			{
				// 时间足够长时，设定为长按模式
				if (curVtorKey->holdTime > VTOR_KEY_TIME_LONG_DOWN)
				{
					curVtorKey->curState = VTOR_KEY_STATS_LONG_DOWN;
				}
				else
				{
					curVtorKey->curState = VTOR_KEY_STATS_DOWN;
				}
			}
			else
			{
				if (curVtorKey->holdTime > VTOR_KEY_TIME_LONG_UP)
				{
					curVtorKey->curState = VTOR_KEY_STATS_LONG_UP;
				}
				else
				{
					curVtorKey->curState = VTOR_KEY_STATS_UP;
				}
			}
		}
		else
		{
			curVtorKey->curState = VTOR_KEY_STATS_SHAKE;
		}

		// 根据curState与lastState，分析组合状态
		if (curVtorKey->curState != curVtorKey->lastState)
		{
			// 当前状态是弹起，触发释放回调
			if (VTOR_KEY_STATS_UP == curVtorKey->curState)
			{
				VtorKey_ReleaseHandler(curVtorKey);
				handlerFlag = VTOR_KEY_STATS_UP;
			}
			// 如果是长弹起，触发combine回调，同时清零combine
			if (VTOR_KEY_STATS_LONG_UP == curVtorKey->curState)
			{
				VtorKey_CombineHandler(curVtorKey);
				handlerFlag = VTOR_KEY_STATS_LONG_UP;
				curVtorKey->combineAction = 0;
			}
			// 当上次是弹起，本次是按下，触发action down回调
			if (VTOR_KEY_STATS_DOWN == curVtorKey->curState)
			{
				VtorKey_PressHandler(curVtorKey);
				handlerFlag = VTOR_KEY_STATS_DOWN;
				curVtorKey->combineAction *= 10;
				curVtorKey->combineAction += VTOR_KEY_COMBINE_SHORT_CLICK;
			}
			else if(VTOR_KEY_STATS_LONG_DOWN == curVtorKey->curState)
			{
				// 因为长按的前一个状态是短按
				// 所以先从  短按  恢复成  没按，再设置成  长按
				curVtorKey->combineAction -= VTOR_KEY_COMBINE_SHORT_CLICK;
				curVtorKey->combineAction += VTOR_KEY_COMBINE_LONG_CLICK;
			}
			curVtorKey->combineAction %= 1000;
		}
		curVtorKey = curVtorKey->next;
	}
	return handlerFlag;
}

#endif // __VTOR_I2C__
